
/**
 * 公共JS库
 * @author solin
 * @date
 */

/**
 * Resize function
 */
(function($,sr){ 
    var debounce = function (func, threshold, execAsap) {
      var timeout;

        return function debounced () {
            var obj = this, args = arguments;
            function delayed () {
                if (!execAsap)
                    func.apply(obj, args); 
                timeout = null; 
            }

            if (timeout)
                clearTimeout(timeout);
            else if (execAsap)
                func.apply(obj, args);

            timeout = setTimeout(delayed, threshold || 100); 
        };
    };

    // smartresize 
    jQuery.fn[sr] = function(fn){  return fn ? this.bind('resize', debounce(fn)) : this.trigger(sr); };

})(jQuery,'smartresize');
/**
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

var CURRENT_URL = window.location.href.split('#')[0].split('?')[0],
    $BODY = $('body'),
    $MENU_TOGGLE = $('#menu_toggle'),
    $SIDEBAR_MENU = $('#sidebar-menu'),
    $SIDEBAR_FOOTER = $('.sidebar-footer'),
    $LEFT_COL = $('.left_col'),
    $RIGHT_COL = $('.right_col'),
    $NAV_MENU = $('.nav_menu'),
    $FOOTER = $('footer');
	
// Sidebar
function init_sidebar() { 
	var setContentHeight = function () {
		// reset height
		// $RIGHT_COL.css('min-height', $(window).height());
		
		var bodyHeight = $BODY.outerHeight(),
		footerHeight = $BODY.hasClass('footer_fixed') ? -10 : $FOOTER.height(),
		leftColHeight = $LEFT_COL.eq(1).height() + $SIDEBAR_FOOTER.height(),
		contentHeight = bodyHeight < leftColHeight ? leftColHeight : bodyHeight;

		// normalize content
		contentHeight -= $NAV_MENU.height() + footerHeight;
	 
		// $RIGHT_COL.css('min-height', contentHeight);
	};

	$SIDEBAR_MENU.find('a').on('click', function(ev) {
        var $li = $(this).parent();

        if ($li.is('.active')) {
            $li.removeClass('active active-sm');
            $('ul:first', $li).slideUp(function() {
                setContentHeight();
            });
        } else {
        	$li.parent().children().removeClass('active');
            // prevent closing menu if we are on child menu
            if (!$li.parent().is('.child_menu')) {
                $SIDEBAR_MENU.find('li').removeClass('active active-sm');
                $SIDEBAR_MENU.find('li ul').slideUp();
            }else
            {
				if ( $BODY.is( ".nav-sm" ) )
				{
					$SIDEBAR_MENU.find( "li" ).removeClass( "active active-sm" );
					$SIDEBAR_MENU.find( "li ul" ).slideUp();
				}
			}
            $li.addClass('active');

            $('ul:first', $li).slideDown(function() {
                setContentHeight();
            });
        }
    });

	// toggle small or large menu 
	$MENU_TOGGLE.on('click', function() {
		console.log('clicked - menu toggle');
		
		if ($BODY.hasClass('nav-md')) {
			$SIDEBAR_MENU.find('li.active ul').hide();
			$SIDEBAR_MENU.find('li.active').addClass('active-sm').removeClass('active');
		} else {
			$SIDEBAR_MENU.find('li.active-sm ul').show();
			$SIDEBAR_MENU.find('li.active-sm').addClass('active').removeClass('active-sm');
		}

		$BODY.toggleClass('nav-md nav-sm');

		setContentHeight();
	});

	// check active menu
	$SIDEBAR_MENU.find('a[href="' + CURRENT_URL + '"]').parent('li').addClass('current-page');

	$SIDEBAR_MENU.find('a').filter(function () {
		return this.href == CURRENT_URL;
	}).parent('li').addClass('current-page').parents('ul').slideDown(function() {
		setContentHeight();
	}).parent().addClass('active');

	// recompute content when resizing
	$(window).smartresize(function(){  
		setContentHeight();
	});

	setContentHeight();

	// fixed sidebar
	if ($.fn.mCustomScrollbar) {
		$('.menu_fixed').mCustomScrollbar({
			autoHideScrollbar: true,
			theme: 'minimal',
			mouseWheel:{ preventDefault: true }
		});
	}
};
// /Sidebar
 

$(document).ready(function() {
	// Panel toolbox
    $('.collapse-link').on('click', function() {
        var $BOX_PANEL = $(this).closest('.x_panel'),
            $ICON = $(this).find('i'),
            $BOX_CONTENT = $BOX_PANEL.find('.x_content');
        
        // fix for some div with hardcoded fix class
        if ($BOX_PANEL.attr('style')) {
            $BOX_CONTENT.slideToggle(200, function(){
                $BOX_PANEL.removeAttr('style');
            });
        } else {
            $BOX_CONTENT.slideToggle(200); 
            $BOX_PANEL.css('height', 'auto');  
        }

        $ICON.toggleClass('fa-chevron-up fa-chevron-down');
    });

    $('.close-link').click(function () {
        var $BOX_PANEL = $(this).closest('.x_panel');

        $BOX_PANEL.remove();
    });
    // /Panel toolbox
    
    $('.date-calendar').click(function() { 
	    $(this).prev().click();
	});
    
    // Sidebar
    init_sidebar();
    // /Sidebar
});

//暂存dialog变量
var DialogData = {};

//常用UI组件封装
var sys = {
	/**
	 * @name sys.Array
	 * @class
	 * @description 数组的一些方法
	 */
	Array : {
		/**
		 * @name sys.Array.getIndex
		 * @function
		 * @description 获取某个元素在数组中的下标,如果该元素不在数组中，返回-1
		 */
		getIndex : function(arr, o) {
			for (var i = 0; i < arr.length; i++) {
				if (sys.Object.equals(arr[i], o)) {
					return i;
				}
			}
			return -1;
		},
		/**
		 * @name sys.Array.remove
		 * @function
		 * @description 将元素从所在的数组中移除,删除成功，则返回true，如果找不到该元素，返回false
		 */
		remove : function(arr, o) {
			for (var i = 0; i < arr.length; i++) {
				if (sys.Object.equals(arr[i], o)) {
					arr.splice(i, 1);
					return true;
				}
			}
			return false;
		},
		/**
		 * @name sys.Array.isArray
		 * @function
		 * @description 判断一个元素是否为数组
		 */
		isArray : function(v) {
			return v && typeof v.length == 'number'
					&& typeof v.splice == 'function';
		},
		toString : function(arr, spliter) {
			if (!spliter)
				return arr.toString();
			var str = "";
			for (var i = 0; i < arr.length; i++) {
				if (i == arr.length - 1) {
					str += arr[i].toString()
				} else {
					str += arr[i].toString() + spliter;
				}
			}
			return str;
		}
	},
	Object: {
		/**
		 * 判断两个数值是否相等（支持对象的对比） 
		 */
		equals : function(x, y) {
			// If both x and y are null or undefined and exactly the same
			if (x === y) {
				return true;
			}

			// If they are not strictly equal, they both need to be Objects
			if (!(x instanceof Object) || !(y instanceof Object)) {
				return false;
			}

			// They must have the exact same prototype chain, the closest we can
			// do is
			// test the constructor.
			if (x.constructor !== y.constructor) {
				return false;
			}

			for ( var p in x) {
				// Inherited properties were tested using x.constructor ===
				// y.constructor
				if (x.hasOwnProperty(p)) {
					// Allows comparing x[ p ] and y[ p ] when set to undefined
					if (!y.hasOwnProperty(p)) {
						return false;
					}

					// If they have the same strict value or identity then they
					// are equal
					if (x[p] === y[p]) {
						continue;
					}

					// Numbers, Strings, Functions, Booleans must be strictly
					// equal
					if (typeof (x[p]) !== "object") {
						return false;
					}

					// Objects and Arrays must be tested recursively
					if (!Object.equals(x[p], y[p])) {
						return false;
					}
				}
			}

			for (p in y) {
				// allows x[ p ] to be set to undefined
				if (y.hasOwnProperty(p) && !x.hasOwnProperty(p)) {
					return false;
				}
			}
			return true;
		}
	},
	/**
	 * 扩展bootstrap-select组件功能，以ajax方式请求数据并组装
	 * 
	 * @author solin
	 * @date
	 * @param config.id
	 *            select的id
	 * @param config.url
	 *            请求数据的远程地址
	 * @param config.param
	 *            请求数据的过滤条件参数
	 * @param config.defaultValue
	 *            默认值
	 * @param config.valueField
	 *            绑定到该组合框的 value 上的基础数据的名称。
	 * @param config.textField
	 *            绑定到该组合框的 text 上的基础数据的名称。
	 * @param config.defaultAll
	 *            true 显示“全部” false 不显示 对应的option的value值为空字符
	 */
	selectpicker: function(config){
		if (typeof config == 'object') {
			if (!config['id'] || !config['url']) {
				return false;
			}
			var defaults = {
				param: {},
				defaultValue: null,
				valueField: 'id',
				textField: 'text',
				defaultAll: false, 
				defaultAllText: "请选择...",
				async: true, //默认异步加载
				loadSuccess: function(data){} //数据加载成功的回调事件
			};
			config = $.extend(defaults, config || {});
			var $select = $('#'+config.id);
			$.ajax({
				type: 	'post',
				url: 	config.url,
				async: 	config.async,
				data: 	config.param,
				dataType: 'json',
				success: function(result){
					if (config.defaultAll) {
						$select.append('<option value="" >'+config.defaultAllText+'</option>');
					}
					var data = result.data || result.rows || result.list || result;
					$.each(data, function(index, row){
						var value = row[config.valueField];
						var text = row[config.textField];
						$select.append('<option value="'+value+'" >'+text+'</option>');
					})
					//设置默认值
					if (config.defaultValue) {
						$select.selectpicker('val', config.defaultValue);
					}
					//设置options
					$select.selectpicker(config);
					//刷新select组件
					$select.selectpicker('refresh');
					//数据加载成功之后的回调事件
					config.loadSuccess(data); 
				}
			})
		}
	},
	/**
	 * 省市区三级联动
	 * @author solin
	 * @date 
	 * @requires jquery.1.11.3.min.js 、bootstrap.min.js 、bootstrap-select.min.js
	 * 
	 * @param config.provinceId
	 *            省元素ID
	 * @param config.cityId
	 *            市元素ID
	 * @param config.areaId
	 *            区元素ID
	 * @param config.defaultProvince
	 *            省默认值
	 * @param config.defaultCity
	 *            市默认值
	 * @param config.defaultArea
	 *            区默认值
	 * @author solin
	 * @date 
	 * =============================================================================================       
	 * @example
	 * 页面元素:
	 * 			<select id="provinceId" name="province" class="selectpicker" title="省" data-live-search="true" data-width="180px"></select>
	 *          <select id="cityId" name="city" class="selectpicker" title="市" data-live-search="true" data-width="150px"></select>
	 *          <select id="areaId" name="area" class="selectpicker" title="区" data-live-search="true" data-width="150px"></select>
	 * 调用方式:
	 * 			sys.threeLevelArea({
	 * 				provinceId: 'provinceId',
	 * 				cityId: 'cityId',
	 * 				areaId: 'areaId',
	 * 				streetId: 'streetId',
	 * 				defaultProvince: 130000, //没有默认值则不设置此key，或者设置值为null
	 * 				defaultCity: 130100, 
	 * 				defaultArea: 130102,
	 * 				defaultStreet: 1123131,
	 * 				defaultAll: true 显示“全部” false 不显示  对应的option的value值为空字符
	 * 			})
	 * ==============================================================================================
	 */
	threeLevelArea: function(config){
		if (typeof config == 'object') {
			if (!config['provinceId'] || !config['cityId'] || !config['areaId']) {
				return false;
			} 
			//请求区域数据地址
			var requestAreaDataUrl = rootPath + "/area/getAreaList";
			//省标签
			var $province = $('#' + config.provinceId);
			//市标签
			var $city = $('#' + config.cityId);
			//区标签
			var $area = $('#' + config.areaId);
			//街道标签
			var $street;
			if (config['streetId']) {
				$street = $('#' + config.streetId);
			}
			
			//请求省数据
			sys.selectpicker({
				id: config.provinceId,  //select的id
				url: requestAreaDataUrl,  //请求数据的远程地址
				param: {rootDepth: '1'}, //过滤参数
				defaultValue: config.defaultProvince, //默认值
				valueField: 'id',
				textField: 'areaName',
				defaultAll: config.defaultAll || false
			});
			if (config.defaultProvince) {
				//请求市数据 
				sys.selectpicker({
					id: config.cityId,  //select的id
					url: requestAreaDataUrl,  //请求数据的远程地址
					param: {parentId: config.defaultProvince}, //过滤参数
					defaultValue: config.defaultCity, //默认值
					valueField: 'id',
					textField: 'areaName',
					defaultAll: config.defaultAll || false
				});
				if (config.defaultCity) {
					//请求区数据
					sys.selectpicker({
						id: config.areaId,  //select的id
						url: requestAreaDataUrl,  //请求数据的远程地址
						param: {parentId: config.defaultCity}, //过滤参数
						defaultValue: config.defaultArea, //默认值
						valueField: 'id',
						textField: 'areaName',
						defaultAll: config.defaultAll || false
					});
					if (config.defaultArea) {
						//请求街道数据
						sys.selectpicker({
							id: config.streetId,  //select的id
							url: requestAreaDataUrl,  //请求数据的远程地址
							param: {parentId: config.defaultArea}, //过滤参数
							defaultValue: config.defaultStreet, //默认值
							valueField: 'id',
							textField: 'areaName',
							defaultAll: config.defaultAll || false
						});
					}
				}
			}
			//省选择框change事件
			$province.on('changed.bs.select', function (e) {
				//获取省ID值
			  	var provinceValue = $(this).selectpicker('val');  
			  	//清空市下拉框
			  	$city.empty().selectpicker('refresh');
			  	//清空区下拉框
			  	$area.empty().selectpicker('refresh');
			  	if (!provinceValue) return; 
			  	//加载市数据
			  	sys.selectpicker({
					id: config.cityId,  //select的id
					url: requestAreaDataUrl,  //请求数据的远程地址
					param: {parentId: provinceValue}, //过滤参数
					defaultValue: config.defaultCity, //默认值
					valueField: 'id',
					textField: 'areaName',
					defaultAll: config.defaultAll || false
				});
			});
			//市选择框change事件
			$city.on('changed.bs.select', function (e) {
				//获取市ID值
				var cityValue = $(this).selectpicker('val');  
				//清空区下拉框
				$area.empty().selectpicker('refresh');
				if (!cityValue) return; 
				//加载区数据
				sys.selectpicker({
					id: config.areaId,  //select的id
					url: requestAreaDataUrl,  //请求数据的远程地址
					param: {parentId: cityValue}, //过滤参数
					defaultValue: config.defaultArea, //默认值
					valueField: 'id',
					textField: 'areaName',
					defaultAll: config.defaultAll || false
				});
			});
			if ($street) {
				//区选择框change事件
				$area.on('changed.bs.select', function (e) {
					//获取区ID值
					var areaValue = $(this).selectpicker('val');  
					//清空区下拉框
					$street.empty().selectpicker('refresh');
					if (!areaValue) return; 
					//加载区数据
					sys.selectpicker({
						id: config.streetId,  //select的id
						url: requestAreaDataUrl,  //请求数据的远程地址
						param: {parentId: areaValue}, //过滤参数
						defaultValue: config.defaultStreet, //默认值
						valueField: 'id',
						textField: 'areaName',
						defaultAll: config.defaultAll || false
					});
				});
			}
 		} else {
			console.log('传入参数不正确，参数类型为对象！')
		}
	},
	/****************************************************************************************
	 * 封装 bootstrap-daterangepicker 功能
	 * **************************************************************************************/
	/**
	 * 日期/时间
	 * @author solin
	 * @date 
	 * @param config.id: 组件ID
	 * @param config.ctlObj 组件对象（通过$('#id')、$('.classsName')、$('input[name="name"]')等获取的组件对象）,如果
	 *						传入了id，则不需要再设置此参数。如果没有设置ID，则一定要设置此参数。
	 * @param config.type 'date'：日期，显示年月日; 'datetime':日期时间，显示年月日时分秒
	 * @param config.startDate 设置默认时间(date/string)
	 * @param config.maxDate 设置限制最大时间(date/string)
	 * @param callback 回调函数 function(date) { console.log(date.format('YYYY-MM-DD HH:mm:ss')) }
	 */
	datepicker: function(config, callback){
		if (typeof config == 'object') {
			if (!config['id'] && !config['ctlObj'] || !config['type']) {
				return false;
			}
			var $date = config.id ? $('#'+config.id) : config.ctlObj;
			var defaults = {
				singleDatePicker: true,
				startDate: new Date(), 
				maxDate: new Date(),
				locale:{
					format: 'YYYY-MM-DD',
					daysOfWeek:["日","一","二","三","四","五","六"],
					monthNames: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],
				}
			};
			if (config.type=="datetime") { 
				defaults.locale.format = 'YYYY-MM-DD HH:mm:ss';
				defaults.locale.applyLabel = "确定";
				defaults.locale.cancelLabel = "清空";
				defaults.timePicker = true;
				defaults.timePicker24Hour = true;
				defaults.timePickerSeconds = true;
				defaults.applyClass = "btn-primary";
			}
			config = $.extend(defaults, config || {});
			$date.daterangepicker(config, callback);
			$date.on("cancel.daterangepicker", function(ev, picker){
				$(this).val('');
		    })
		}
	},
	/**
	 * 日期/时间范围
	 * @author solin
	 * @date 
	 * @param config.id: 组件ID
	 * @param config.ctlObj 组件对象（通过$('#id')、$('.classsName')、$('input[name="name"]')等获取的组件对象）,如果
	 *		  				传入了id，则不需要再设置此参数。如果没有设置ID，则一定要设置此参数。
	 * @param config.type 'date'：日期，显示年月日; 'datetime':日期时间，显示年月日时分秒
	 * @param config.startDate 设置默认时间(date/string)
	 * @param config.maxDate 设置限制最大时间(date/string)
	 * @param callback 回调函数 function(start, end, label) { 
	 * 			console.log(start.format('YYYY-MM-DD'))
	 *			console.log(end.format('YYYY-MM-DD'))  
	 *		}
	 */
	daterangepicker: function(config, callback){
		if (typeof config == 'object') {
			if (!config['id'] && !config['ctlObj'] || !config['type']) {
				return false;
			}
			var $date = config.id ? $('#'+config.id) : config.ctlObj;
			var defaults = {
				startDate: moment().subtract(1, "days"), 
				maxDate:new Date(),
				applyClass: "btn-primary",
				locale:{
					format: 'YYYY-MM-DD',
					daysOfWeek:["日","一","二","三","四","五","六"],
					monthNames: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],
					applyLabel: "确定",
	        		cancelLabel: "清空",
				},
			};
			if (config.type=="datetime") { 
				defaults.locale.format = 'YYYY-MM-DD HH:mm:ss';
				defaults.timePicker = true;
				defaults.timePicker24Hour = true;
				defaults.timePickerSeconds = true;
			}
			config = $.extend(defaults, config || {});
			$date.daterangepicker(config, callback);
			$date.on("cancel.daterangepicker", function(ev, picker){
				$(this).val('');
		    })
		}
	},
	/**************************************************************
	 * 封装 bootstrap3dialog 功能
	 * 如果在Iframe中调用，如果要让遮罩层显示在Iframe外面，则调用外层的Dialog
	 **************************************************************/ 
	/**
	 * 弹出普通提示的模态框(在iframe中调用)
	 * @author solin
	 * @date 
	 * @param str 		提示信息
	 * @param func 		回调函数
	 * @param timeout 	自动关闭时间（单位毫秒）
	 */
	show: function(str, func, timeout){
		show(str, func, timeout);
	},
	/**
	 * 弹出错误提示的模态框(在iframe中调用)
	 * @param str 		提示信息
	 * @param func 		回调函数
	 * @param timeout 	自动关闭时间（单位毫秒）
	 */
	showErr: function(str, func, timeout) {
		showErr(str, func, timeout);
	},
	/**
	 * 弹出成功提示的模态框(在iframe中调用)
	 * @param str 		提示信息
	 * @param func 		回调函数
	 * @param timeout 	自动关闭时间（单位毫秒）
	 */
	showSuccess: function(str, func, timeout) { 
		showSuccess(str, func, timeout);
	},
	/**
	 * confirm确认选择框(在iframe中调用)
	 * @author solin
	 * @date 
	 * @param str 		提示信息
	 * @param funcok 	点击确定按钮的回调函数
	 * @param funcclose 点击取消按钮的回调函数
	 */
	showConfirm: function(str, funcok, funcclose) {
		showConfirm(str, funcok, funcclose);
	},
	/**
	 * 打开iframe页面(在iframe中调用)
	 * @author solin
	 * @date 
	 * @param func 	关闭窗体时的回调事件
	 * @param config 属性配置
	 */
	showRemote: function(url, func, config){
		showRemote(url, func, config); 
	},
	/**
	 * 关闭Iframe dialog窗体(在iframe中调用)
	 * @author solin
	 * @date 
	 */
	closeRemote: function(){
		closeRemote();
	},
	/**
	 * 设置变量，在dialog窗体中设置，在父页面中获取(在iframe中调用)
	 * @author solin
	 * @date 
	 */
	dialog: {
		setData: function(key, value){
			parent.DialogData[key] = value;
		},
		getData: function(key, value){
			return parent.DialogData[key];
		}
	},
	/************************************************************************/
	
	/************************************************************************
	 * @description  Bootstrap Table 封装方法
	 * @class
	 * @requires  jquery-1.10.3.js
	 * @requires  bootstrap.min.js
	 * @requires  bootstrap-table.js
	 * @requires  bootstrap-table-zh-CN.min.js
	 ************************************************************************/
	/**
     * @name sys.initTable
     * @function
     * @description 初始化表格(bootstrap table 开发文档 http://bootstrap-table.wenzhixin.net.cn/zh-cn/documentation/)
     * @author solin
	 * @date 
	 * @param  {Object} o Bootstrap table Option 对象
     * @param  {String} tableName 表格名称
     * @param  {String} o.url 请求数据的连接地址
     * @param  {Function} queryParams 查询参数函数
     * @param  {Array}  o.coloumns 列对象数组  
     * @example
     * sys.initTable('tt', {url:'www.data.com', columns:[{}]}); 
     */
	initTable: function(tableName, o){ 
		/*解决 后台取不到 pageNumber 的问题

		 修改 bootstrap-table.js  

		if (this.options.queryParamsType === 'limit') {
		params = {
		search: params.searchText,
		sort: params.sortName,
		order: params.sortOrder
		};
		if (this.options.pagination) {
		params.limit = this.options.pageSize;

		params.pageNumber=this.options.pageNumber,  //增加这一句
		params.offset = this.options.pageSize * (this.options.pageNumber - 1);
		}
		}*/
		var defaults = {
			url: '',  
			method: 'post',
			ajaxOptions:{async: true}, //默认异步
			sidePagination: "server",
			pagination: true,   
			pageNumber: 1,   
			pageSize: 10,  
			pageList: [10, 25, 50, 100],  
			queryParamsType: "limit",
			dataType: "json",
			contentType: "application/x-www-form-urlencoded",
			queryParams: function(params) { 
				return {  
						rows: params.limit, //页面大小 
			  		 	page: params.pageNumber //页码 
			  	}; 
			},
			striped: false, 
			cache: false,  
			sortable: false, 
			search: false, 
			paginationVAlign: 'bottom',
			paginationHAlign: "right", 
			paginationDetailHAlign: "left", 
			paginationPreText: "上一页", 
			paginationNextText: "下一页", 
			columns: [],
			onLoadSuccess: function(data){
				//数据加载成功事件
			},
			onLoadError: function(data){
				//数据加载失败事件
			}
		};
		if (typeof o == 'object') { 
            o = $.extend(defaults, o || {});
        }; 
		var $tt = $('#' + tableName);
		$tt.bootstrapTable("destroy").bootstrapTable(o);
		return $tt;
	},
	/**
     * @name sys.reloadTable
     * @function
     * @description 重新加载数据 
	 * @author solin
	 * @date 
     * @param  {String} tableName 表格名称 
     * @param  {Object} o Bootstrap table Option 对象, 如果需要增加除页面设置外的其他参数，可设定；否则可默认不填写
     * @example
     * sys.reloadTable('tt'); 
     */
	reloadTable: function(tableName, o){
		var $tt = $('#' + tableName);
		var pageSize = $tt.bootstrapTable("getOptions").pageSize;
		var defaults = {
			pageNumber: 1, 
			pageSize: pageSize	
		} 
		if (typeof o == 'object') { 
			defaults = $.extend(defaults, o || {});
        }; 
		$tt.bootstrapTable("refreshOptions", defaults);
	}
}

/**
 * 动态创建表单并提交
 */
function postForm(config){
	config = config || {};
	var url = config.url,
        method = config.method || 'POST',
        target = config.target || '_self', //_blank
        params = config.params || {};
     
    var form = document.createElement('form'); 
    form.action = url;
    form.method = method;
    form.target = target;
     
    for(var param in params){
        var value = params[param],
            input = document.createElement('input');

        input.type = 'hidden'; 
        input.name = param;
        input.value = value;

        form.appendChild(input);
    }
    document.body.appendChild(form); //这句必须加上，否则在火狐下会不能提交表单
    $(form).submit();     
    form = null; 
}
 
/************************layer弹框封装开始****************************************/
/**
 * 弹出普通提示的模态框
 * @author solin
 * @date 
 * @param str 		提示信息
 * @param func 		回调函数
 * @param timeout 	自动关闭时间（单位毫秒）
 * @example
 *  show('提示')
 */
var show = function(str, func, timeout) {
	// 调用show方法
	layer.alert(str, {icon: 0, skin: 'layui-layer-lan', time: timeout || 3000}, function(index){if (func){func.call();}layer.close(index);}); 
};
/**
 * 弹出错误提示的模态框
 * @author solin
 * @date 
 * @param str 		提示信息
 * @param func 		回调函数
 * @param timeout 	自动关闭时间（单位毫秒）
 * @example
 *  showErr('出错了。。。', function(index){alert('callback test'); })
 */
var showErr = function(str, func, timeout) {
	layer.alert(str, {icon: 2, skin: 'layui-layer-lan', time: timeout || 3000}, function(index){if (func){func.call();}layer.close(index);}); 
};

/**
 * 弹出成功提示的模态框
 * @author solin
 * @date 
 * @param str 		提示信息
 * @param func 		回调函数
 * @param timeout 	自动关闭时间（单位毫秒）
 * @example
 * showSuccess('成功', function(){alert('callback test'); })
 */
var showSuccess = function(str, func, timeout) {
	layer.alert(str, {icon: 1, skin: 'layui-layer-lan', time: timeout || 3000}, function(index){if (func){func.call();}layer.close(index);}); 
};

/**
 * confirm确认选择框
 * @author solin
 * @date 
 * @param str 		提示信息
 * @param funcok 	点击确定按钮的回调函数
 * @param funcclose 点击取消按钮的回调函数
 */
var showConfirm = function(str, funcok) {
	return layer.confirm(str, {icon: 3, skin: 'layui-layer-lan', title:'确认'}, function(index){
		funcok.call();
		layer.close(index);
	});
};

/**
 * 打开iframe页面
 * @author solin
 * @date 
 * @param func 	关闭窗体时的回调事件
 * @param config 属性配置
 */
var showRemote = function(url, func, config) {
	var defaults = {
		title: '',
		width: 600,
		height: 500
	};
	config = $.extend(defaults, config || {});
	return layer.open({
	  type: 2,//弹框类型
	  title: config.title,//弹框标题
	  area: [config.width+'px', config.height+'px'],//弹框大小，宽高
	  skin: 'layui-layer-lan',//皮肤
	  fixed: false, //是否固定，不固定
	  content: url,//加载内容，可以是一句话也可以是连接
	  shade:[0.8, '#393D49'],//遮罩，透明度以及颜色
	  end: func
	});
	
}

/**
 * 关闭Iframe dialog窗体(在iframe中调用)
 * @author solin
 * @date 
 */
var closeRemote = function(){
	var index = parent.layer.getFrameIndex(window.name);
	parent.layer.close(index);
}

/**
 * 打开iframe弹框
 * @param title:弹框标题
 * @param width:弹框宽度，只需传入数值
 * @param height:弹框高度，只需传入数值
 * @param url:弹框内容显示地址
 */
function showDialogUrl(title,width,height,url, callFunc){
	return layer.open({
	  type: 2,//弹框类型
	  title: title,//弹框标题
	  area: [width+'px', height+'px'],//弹框大小，宽高
	  skin: 'layui-layer-lan',//皮肤
	  fixed: false, //是否固定，不固定
	  content: url,//加载内容，可以是一句话也可以是连接
	  shade:[0.8, '#393D49'],//遮罩，透明度以及颜色
	  end: callFunc
	});
}

/**
 * 确认删除对话框
 * @param msg 确认提示信息:如，确认要删除此信息记录吗？
 * @param id 要删除的信息ID
 * @param url 删除操作的资源url
 */
function confirmDel(msg,id,url){
	layer.confirm(msg,{
		  btn: ['确定','取消'], //按钮
		  skin: 'layui-layer-lan' //样式类名
		}, function(){
			$.post(url,{
				id:id
				},function(data){
					if(data>0){//删除成功刷新页面
						window.location.reload(); 
					}else{//删除失败弹出提示框
						layer.alert('删除失败', {
					        skin: 'layui-layer-lan'
					    });
					}
				});
		}, function(){});
}

/**
 * 批量删除确认对话框
 * @param msg 确认提示信息:如，确认要删除选中信息记录吗？
 * @param id 选中的name名称，如：selectId
 * @param url 删除操作的资源url
 */
function batchDelDialog(msg,id,url){
	layer.confirm(msg, {
		  btn: ['确定','取消'], //按钮
		  skin: 'layui-layer-lan' //样式类名
		}, function(){
			var form = getForm(url);
			// 获取勾选的资源
			var ids = $("input[name='"+ids+"']:checked").clone();
		    form.append(ids);
		    form.appendTo("body");
		    form.submit();
		}, function(){});
}

/**
 * 操作结果提示框
 * @param flag 操作结果，只有为success时才提示成功
 * @param msg 提示信息
 */
function msg(msg){
	layer.alert(msg, {
		icon:0,//图标，可以传入1到6的数字
	    skin: 'layui-layer-lan' //皮肤，还支持layui-layer-molv
	});
}

//构建一个form表单
function getForm(url) {
	//构建form进行提交
	var form = $('<form></form>');  
    form.attr('action', rootPath+url);  
    form.attr('method', 'post');  
    form.attr('target', '_self'); 
    $("body").append(form);
    return form;
}
/************************layer弹框封装结束****************************************/

// 初始化bootstrap 表格的复选框列
function initBootstrapTableCheckbox(){
	$("input[name='btSelectItem'],input[name='btSelectAll']").iCheck({
		checkboxClass: 'icheckbox_square-green',
	    radioClass: 'iradio_square-green',
	    increaseArea: '20%'
	});
	$("input[name='btSelectAll']").on('ifClicked',function(event){
		if($(this).is(":checked")){
			$("input[name='btSelectItem']").iCheck('uncheck');
			$("input[name='btSelectItem']").each(function(i,item){
				$(this).closest("tr").removeClass("selected");
			});
		}else{
			$("input[name='btSelectItem']").iCheck('check');
			$("input[name='btSelectItem']").each(function(i,item){
				$(this).closest("tr").addClass("selected");
			});
		}
	});
}

/**
 * 保留两位小数
 * @param num
 * @returns {Number}
 */
function numberRand2(num){
	if(!num || num == null || num == undefined){
		return 0.00;
	}else{
		var num_value = parseFloat(num);
		return (Math.round(num_value * 100) / 100).toFixed(2);
	}
}

/**
 * 获取数值型整数部分
 * @param num
 * @returns
 */
function numberInteger(num){
	if(!num || num == null || num == undefined){
		return "0";
	}else{
		var num_value = parseFloat(num);
		var numStr = (Math.round(num_value * 100) / 100).toFixed(2);
		return numStr.substring(0,numStr.indexOf("."));
	}
}

/**
 * 获取数值型两位小数
 * @param num
 * @returns
 */
function numberDecimal(num){
	if(!num || num == null || num == undefined){
		return ".00";
	}else{
		var num_value = parseFloat(num);
		var numStr = (Math.round(num_value * 100) / 100).toFixed(2);
		return numStr.substring(numStr.indexOf("."));
	}
}

/* 
 * formatMoney(s,type) 
 * 功能：金额按千位逗号分隔，负号用括号
 * 参数：s，需要格式化的金额数值. 
 * 参数：type,判断格式化后的金额是否需要小数位. 
 * 返回：返回格式化后的数值字符串. 
 */ 
function formatMoney(s, type) {
    var result = s;
    if (s < 0)
        s = 0 - s;
    if (/[^0-9\.]/.test(s))
        return "0.00";
    if (s == null || s == "null" || s == "")
        return "0.00";
    if (type > 0)
        s = new Number(s).toFixed(type);
    s = s.toString().replace(/^(\d*)$/, "$1.");
    s = (s + "00").replace(/(\d*\.\d\d)\d*/, "$1");
    s = s.replace(".", ",");
    var re = /(\d)(\d{3},)/;
    while (re.test(s))
        s = s.replace(re, "$1,$2");
    s = s.replace(/,(\d\d)$/, ".$1");
    if (type == 0) {
        var a = s.split(".");
        if (a[1] == "00") {
            s = a[0];
        }
    }
    if (result < 0)
        result = "(" + s + ")";
    else
        result = s;
    return result;
}




/**
 * 判断是否整数
 */
function isInteger(obj) {
	return typeof obj === 'number' && obj%1 === 0
}

//重新封装clipboard实现完美兼容IE7+
var ClipBoard = function(obj){
    this.handlerID = obj.handlerID || null;
    this.textID = obj.textID || null;
    this.type = obj.type || 'copy';
    this.isAttr = obj.isAttr || false;
    this.isPlugin = true;
    this.isActive = false;

    var ua = window.navigator.userAgent;
    var is_IE = ua.match(/(rv:|msie )\d+/i);
    var IE_Version = is_IE ? parseInt(is_IE[0].split(/:| /g)[1]) : 9;
    if(IE_Version <= 8){
        this.isPlugin = false;
    }
    var handlerObj = document.getElementById(obj.handlerID);
    if(typeof this.type === 'string'){
        handlerObj.setAttribute('data-clipboard-action',this.type)
    }else{
        throw error('type类型错误！');
    }
    if(!obj.isAttr && obj.textID){
        handlerObj.setAttribute('data-clipboard-target','#'+obj.textID);
    }
}
ClipBoard.prototype.attach = function(){
    if(this.isActive){ // 对象已经被实例化
        return;
    }
    var tip = '复制';
    if(this.type === 'cut'){
        tip = '剪切';
    }
    this.isActive = true;
    if(this.isPlugin){
        var clip = new Clipboard('#'+this.handlerID);
        clip.on('success', function(e) {
            alert(tip+'成功，可通过Ctrl+V进行粘贴！');
        });
        clip.on('error', function(e) {
            alert(e.action+'操作失败！');
        });
    }else if(window.attachEvent){
        var self = this;
        var handlerObj = document.getElementById(this.handlerID);
        handlerObj.attachEvent('onclick',function(){
            var text = '';
            if(self.isAttr){// 复制属性值
                text = handlerObj.getAttribute('data-clipboard-text');
            }else{
                var textObj = document.getElementById(self.textID);
                text = textObj.value || textObj.innerHTML;
            }
            window.clipboardData.setData('Text',text);
            alert(tip+'成功，可通过Ctrl+V进行粘贴！');
        });
    }else{
            alert('浏览器版本过低，不支持该插件！')
    }
}


/*用法 
首先引入clipboard.js以及上面那段代码，然后通过new的方式去实例化控件

// html
<p id="copy-p" class="a">将被复制的p文本</p>
<button id="copy-btn">复制</button>
<script src="/path/clipboard.js"></script>

// js
var c1 = new ClipBoard({
    handlerID: 'copy-btn',
    textID: 'copy-p',
    isAttr: false,
    type:'copy'
});
c1.attach(); // 触发复制/剪切功能*/


$(document).ready(function() {
	  var hash = window.location.hash.replace('#', '');

	  if (hash && $('.' + hash).length) {
	    var point = $('.' + hash).offset().top - 40;

	    if (window.Zepto) {
	      window.scrollTo(0, point);
	    } else {
	      $(window).scrollTop($('.' + hash).offset().top - 40);
	    };
	  };

	  $('.skin dt').click(function() {
	    $(this).siblings().removeClass('selected').end().prev('dd').andSelf().addClass('selected');
	  });

	  $('.arrows .top, .arrows .bottom, .features .self, .skins-info .self, .usage .self').click(function(event) {
	    var target = $(this).data('to'),
	      target_offset = $('.' + target).offset().top;

	    event.preventDefault();
	    window.location.hash = target;

	    if (window.Zepto) {
	      window.scrollTo(0, target_offset - 40);
	    } else {
	      $('html, body').stop().animate({scrollTop: target_offset - 40}, 600);
	    };
	  });

	  $('.colors li').click(function() {
	    var self = $(this);

	    if (!self.hasClass('active')) {
	      self.siblings().removeClass('active');

	      var skin = self.closest('.skin'),
	        color = self.attr('class') ? '-' + self.attr('class') : '',
	        checkbox = skin.data('icheckbox'),
	        radio = skin.data('iradio'),
	        checkbox_default = 'icheckbox_minimal',
	        radio_default = 'iradio_minimal';

	      if (skin.hasClass('skin-square')) {
	        checkbox_default = 'icheckbox_square', radio_default = 'iradio_square';
	        checkbox == undefined && (checkbox = 'icheckbox_square-green', radio = 'iradio_square-green');
	      };

	      if (skin.hasClass('skin-flat')) {
	        checkbox_default = 'icheckbox_flat', radio_default = 'iradio_flat';
	        checkbox == undefined && (checkbox = 'icheckbox_flat-red', radio = 'iradio_flat-red');
	      };

	      if (skin.hasClass('skin-line')) {
	        checkbox_default = 'icheckbox_line', radio_default = 'iradio_line';
	        checkbox == undefined && (checkbox = 'icheckbox_line-blue', radio = 'iradio_line-blue');
	      };

	      checkbox == undefined && (checkbox = checkbox_default, radio = radio_default);

	      skin.find('input, .skin-states .state').each(function() {
	        var element = $(this).hasClass('state') ? $(this) : $(this).parent(),
	          element_class = element.attr('class').replace(checkbox, checkbox_default + color).replace(radio, radio_default + color);

	        element.attr('class', element_class);
	      });

	      skin.data('icheckbox', checkbox_default + color);
	      skin.data('iradio', radio_default + color);
	      self.addClass('active');
	    };
	  });

	  $('.demo-methods dt .self').click(function() {
	    var self = $(this),
	      self_class = self.attr('class').replace('self ', '');

	    switch (self_class) {
	      case 'do-check':
	        $('#input-1, #input-3').iCheck('check');
	        break;
	      case 'do-uncheck':
	        $('#input-1, #input-3').iCheck('uncheck');
	        break;
	      case 'do-disable':
	        $('#input-2, #input-4').iCheck('disable');
	        break;
	      case 'do-enable':
	        $('#input-2, #input-4').iCheck('enable');
	        break;
	      case 'do-destroy':
	        $('.demo-list input').iCheck('destroy');
	        break;
	      default:
	        var text = self.hasClass('active') ? 'show code' : 'hide code';

	        self.toggleClass('active').text(text);

	        if (window.Zepto) {
	          $(this).closest('dt').next().toggle();
	        } else {
	          $(this).closest('dt').next().slideToggle(200);
	        };

	        break;
	    };
	  });
	});
